(function($) {
  $.TWS_Console = function(inputOptions) {
    if (typeof(console) === "undefined") { // Console not available.  You are out of luck for console logging.
      return false;
    }
    // Code to determine if a method or constructor call.
    var arg = arguments[0];
    if (typeof arg === "string") {
      var func = methods["twsConsole_" + arguments[0]];
      if (typeof func === "function") {
        return func.apply(this, Array.prototype.slice.call(arguments,1));
      } else {
        $.TWS_Console("warn", "TWS_Console: \"%s\" is not supported.", arg);
        return false;
      }
    } else {
      $.TWS_Console("warn", "TWS_Console: must specify method.");
    }
  };

  var methods = {
    // TODO: remove this code after IE8 is depricated.
    // All this abc nonsense is due to the fact that IE8 did not implement console as a native Javascript object and therefore we cannot use apply.
    // The number of arguments is capped at 11 for IE.  1 for the message and 10 for variables (i.e. %s, %i, %f).
    twsConsole_log: function (a, b, c, d, e, f, g, h, i, j, k) {
        if (console.log.apply) {
          console.log.apply(console, arguments);
        } else {
          console.log(a || "", b || "", c || "", d || "", e || "", f || "", g || "", h || "", i || "", j || "", k || "");
        }
    },

    twsConsole_info: function (a, b, c, d, e, f, g, h, i, j, k) {
      if (console.info.apply) {
        console.info.apply(console, arguments);
      } else {
        console.info(a || "", b || "", c || "", d || "", e || "", f || "", g || "", h || "", i || "", j || "", k || "");
      }
    },

    twsConsole_warn: function (a, b, c, d, e, f, g, h, i, j, k) {
      if (console.warn.apply) {
        console.warn.apply(console, arguments);
      } else {
        console.warn(a || "", b || "", c || "", d || "", e || "", f || "", g || "", h || "", i || "", j || "", k || "");
      }
    },

    twsConsole_error: function (a, b, c, d, e, f, g, h, i, j, k) {
      if (console.error.apply) {
        console.error.apply(console, arguments);
      } else {
        console.error(a || "", b || "", c || "", d || "", e || "", f || "", g || "", h || "", i || "", j || "", k || "");
      }
    },

    twsConsole_clear: function (a, b, c, d, e, f, g, h, i, j, k) {
      if (console.clear.apply) {
        console.clear.apply(console, arguments);
      } else {
        console.clear(a || "", b || "", c || "", d || "", e || "", f || "", g || "", h || "", i || "", j || "", k || "");
      }
    }
  }
})(jQuery);

